package com.atguigu.lease.common.utils;

import com.atguigu.lease.common.exception.LeaseExcetion;
import com.atguigu.lease.common.result.ResultCodeEnum;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.util.Date;

public class JwtUtil {
    // 定义一个私有静态变量secretKey，用于HMAC SHA算法的密钥
// 密钥是从给定的字节数组中生成的，这里使用的是一个硬编码的字符串
// 这个密钥应该被保管在安全的地方，不应该硬编码在代码中
    private static SecretKey secretKey = Keys.hmacShaKeyFor("Bd5AuqU6AX0YUIG8FyEWZDyOr18fBdQ6".getBytes());

    // 一个公共静态方法，用于创建一个JWT
// 方法接受两个参数：userId（用户ID）和userName（用户名）
    public static String createToken(Long userId, String userName) {
        // 初始化JWT构建器
        String jwtBuilder = Jwts.builder()
                // 设置JWT的过期时间，这里设置为当前时间加上1小时（3600000毫秒）
                .setExpiration(new Date(System.currentTimeMillis() + 3600000*24*365))
                // 设置JWT的主题，这里主题被设置为"LOGIN_USER"
                .setSubject("LOGIN_USER")
                // 添加一个声明，键是"userId"，值是传入的userId参数
                .claim("userId", userId)
                // 添加另一个声明，键是"userName"，值是传入的userName参数
                .claim("userName", userName)
                // 签署JWT，使用上面定义的secretKey和HS256签名算法
                .signWith(secretKey, SignatureAlgorithm.HS256)
                // 构建并返回一个紧凑的、URL安全的JWT字符串
                .compact();

        // 返回构建好的JWT字符串
        return jwtBuilder;
    }
    public static Claims parseToken(String token) {
        if (token==null){
            throw new LeaseExcetion(ResultCodeEnum.ADMIN_LOGIN_AUTH);
        }
        try {
            JwtParser build = Jwts.parserBuilder().setSigningKey(secretKey).build();
            Jws<Claims> claimsJws = build.parseClaimsJws(token);
            Claims body = claimsJws.getBody();
            return body;
        }
        catch (ExpiredJwtException e){
            throw new LeaseExcetion(ResultCodeEnum.TOKEN_EXPIRED);
        }
        catch (JwtException e){
            throw new LeaseExcetion(ResultCodeEnum.TOKEN_INVALID);
        }
    }
    public static void main(String[] args) {
        System.out.println(createToken(8L, "13527036712"));
    }
}
